package com.eian.boot.module.system.associations.user.role.listener;

import com.eian.boot.module.system.associations.user.role.event.RoleUnassignedEvent;
import com.eian.boot.module.system.associations.user.role.event.UserRoleAssignedEvent;
import com.eian.boot.module.system.associations.user.role.event.UserRoleRemovedEvent;
import com.eian.boot.module.system.permission.service.PermissionCacheService;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.event.EventListener;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;

/**
 * 用户角色关系事件监听器
 * 处理关系变更后的副作用（如缓存清理）
 *
 * @author alex.meng
 * @since 1.0.0
 */
@Slf4j
@Component
@AllArgsConstructor
public class UserRoleEventListener {

    private final PermissionCacheService cacheService;

    /**
     * 监听用户角色分配事件
     * 异步清理用户权限缓存
     */
    @Async
    @EventListener
    public void onUserRoleAssigned(UserRoleAssignedEvent event) {
        log.debug("处理用户角色分配事件: userId={}", event.getUserId());
        cacheService.clearUserAllCache(event.getUserId());
    }

    /**
     * 监听用户角色删除事件（用户被删除）
     * 异步清理用户权限缓存
     */
    @Async
    @EventListener
    public void onUserRoleRemoved(UserRoleRemovedEvent event) {
        log.debug("处理用户角色删除事件: userId={}", event.getUserId());
        cacheService.clearUserAllCache(event.getUserId());
    }

    /**
     * 监听角色解绑事件（角色被删除）
     * 批量清理所有关联用户的权限缓存
     */
    @Async
    @EventListener
    public void onRoleUnassigned(RoleUnassignedEvent event) {
        log.debug("处理角色解绑事件: roleId={}, affectedUsers={}",
                event.getRoleId(), event.getUserIds().size());
        event.getUserIds().forEach(userId ->
                cacheService.clearUserAllCache(userId));
    }
}

